package com.taoyun.web.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.taoyun.pojo.entity.User;
import com.taoyun.service.IUserService;
import com.taoyun.utils.MD5;
import com.taoyun.utils.Response;
import com.taoyun.utils.UserUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;


import javax.servlet.http.HttpServletRequest;
import java.util.UUID;

@RestController
public class LoginController {

    @Autowired
    private IUserService userService;


    //注入连接池对象
    @Autowired
    private JedisPool jedisPool;
    // 和 application.yml中的 default_token_valid_time进行绑定
    @Value("${server.default_token_valid_time}")
    private Integer defaultTokenValidTime;


    /**
     * 登录功能
     * @param userNumber 员工号（账号）
     * @param password 密码
     * @param validTime token存活时间(不用从前端获取）
     * @return
     *
     * 请求方法：post
     * path:http://localhost:8080/taoyun/v1/login
     *
     *请求成功：
     * {
     *     "code": "200",
     *     "msg": "登录成功！欢迎您，管理员!",
     *     "data": "072c29fcb87d43f1ae5603af5e1c66f7" //token
     * }
     *
     *请求失败：
     *
     *{
     *     "code": "500",
     *     "msg": "账号或者密码有误！",
     *     "data": null
     * }
     *
     */
    @PostMapping("taoyun/v1/login")
    public Response login(@RequestParam(value="userNumber") String userNumber,@RequestParam(value="password") String password,Integer validTime){
        // 判断账号以及密码是否为空
        if(userNumber == null || "".equals(userNumber)){
            return Response.error("账号不能为空");
        }
        if(password == null || "".equals(password)){
            return Response.error("密码不能为空");
        }
        //获取数据库信息，如果对象不为空，则账号密码均匹配
        User user = userService.login(userNumber, MD5.stringMD5(password));
        //如果没有传入时间，则按站点的默认有效时间
        if(validTime==null){
            validTime = this.defaultTokenValidTime;
        }
        //登录成功
        if(user!=null){
            //System.out.println("登录成功！！！");
            // 生成完全独立的访问令牌
            String tokenLogin = UUID.randomUUID().toString().replace("-","").toLowerCase();
            // System.out.println("生成的token令牌："+tokenLogin);
            // 将需要保存到Redis数据库的对象转换成json字符串
            // 注： ObjectMapper是Jackson库中主要用于读取和写入Json数据的类
            ObjectMapper mapper = new ObjectMapper();
            try {
                // 真正的把user对象转换成Json数据响应到页面
                String jsonRst = mapper.writeValueAsString(user);
                //连接池对象
                Jedis jedis = jedisPool.getResource();
                //写入token和对应的用户对象
                jedis.set(tokenLogin, jsonRst);
                //设置键值对的有效时间
                jedis.expire(tokenLogin, validTime);
                //关闭
                jedis.close();
                //判断账号状态是否正常
                if(user.getState().equals("正常")){
                    //判断角色
                    if(user.getPermission().equals("超管")){
                        return Response.success("登录成功！欢迎您，超管!",tokenLogin);
                    }
                    else if(user.getPermission().equals("管理员")){
                        return Response.success("登录成功！欢迎您，管理员!",tokenLogin);
                    }
                    else{
                        return  Response.success("登录成功！欢迎您，xxx",tokenLogin);
                    }
                }
                else{
                    return  Response.success("您的账号已经被冻结",tokenLogin);
                }
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        else{
            return Response.error("账号或者密码有误！");
        }
        return null;
    }


    /**
     * 测试通过token能否获取value
     * @param request
     * @return
     *
     * 请求方法：get
     * path: http://localhost:8080/taoyun/v1/getUser
     *
     *
     * {
     *     "code": "200",
     *     "msg": "请求成功",
     *     "data": {
     *         "userId": 9,
     *         "userNumber": "2010414123",
     *         "name": "达闻西",
     *         "sex": "男",
     *         "phoneNumber": "12311232",
     *         "password": "827CCB0EEA8A706C4C34A16891F84E7B",
     *         "email": "2823321716@qq.com",
     *         "department": "销售部",
     *         "permission": "管理员",
     *         "state": "正常"
     *     }
     * }
     *
     */
    @GetMapping("taoyun/v1/getUser")
    public Response getUserByToken(HttpServletRequest request){
        User user = UserUtil.getUserByRequest(request);
        if(user!=null){
            return Response.success("请求成功",user);
        }
        else{
            return Response.error("获取数据失败");
        }

    }


    /**
     * 退出登录
     * @param request 用于请求头部信息
     * @return
     *
     * 方法：post
     * path: http://localhost:8080/taoyun/v1/logout
     *
     *请求成功
     * {
     *     "code": "200",
     *     "msg": "退出登录成功！",
     *     "data": null
     * }
     *
     */
    @PostMapping("taoyun/v1/logout")
    public Response logout(HttpServletRequest request){
        // 获取头部的令牌
        String tokenLogin = request.getHeader("tokenLogin");
        //连接池对象
        Jedis jedis = jedisPool.getResource();
        //删除令牌
        jedis.del(tokenLogin);

        return Response.success("退出登录成功！",null);
    }


}
